package org.sith.taskrunner.api.toolkit;

import org.sith.taskrunner.api.transformer.InputDataTransofrmer;
import org.sith.taskrunner.api.transformer.ResultTransformer;
import org.sith.taskrunner.api.task.Task;
import org.sith.taskrunner.api.TaskToolkitDescription;

/**
 * Interface for toolkit
 *
 * @param <T> task class
 * @param <I> input data transformer class
 * @param <R> result transformer class
 * @param <D> description class
 */
public interface TaskToolkit<T extends Task, I extends InputDataTransofrmer, R extends ResultTransformer, D extends TaskToolkitDescription> {

    /**
     * Create <bold>new</bold> task instance
     *
     * @return <bold>New</bold> task instance
     */
    public T createTaskInstance();

    /**
     * Get input data transformer
     *
     * @return input data transformer instance
     */
    public I getInputDataTransofrmer();

    /**
     * Get transformer for task result
     *
     * @return transformer for task result
     */
    public R getResultTransformer();

    /**
     * Get toolkit description
     *
     * @return toolkit description
     */
    public D getToolkitDescription();

}
